package com.example.libpro.Service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.text.TextUtils;

import com.example.libpro.DAO.BookDAO;
import com.example.libpro.DAO.BorrowRecordDAO;
import com.example.libpro.DAO.ReaderDAO;
import com.example.libpro.DBEntity.BookEntity;

import java.util.List;

/**
 * 图书管理系统图书管理业务服务类
 * 作用：1. 处理图书管理全流程业务逻辑，封装《安卓设计报告.docx》中"管理员·图书管理"（新增/修改/删除/查询图书）与"读者·图书检索"；
 * 2. 调用BookDAO实现数据访问，处理业务规则（如图书ID唯一性、库存合理性校验）；
 * 3. 为应用层（BookManager）提供图书管理接口，区分管理员与读者的查询权限（管理员查全量，读者仅查在库）。
 * 核心业务：图书信息校验、库存逻辑处理、图书查询权限控制、图书删除前校验
 * 依赖：BookDAO（图书表CRUD操作）、BorrowRecordDAO（删除图书时检查未还记录）
 */
public class BookService extends Service {
    private static final String TAG = "BookService";
    private BookDAO bookDAO;
    private final IBinder binder = new BookService.LocalBinder();

    // 构造方法：初始化DAO
    /**
     * BookService构造方法
     * @param context Android上下文对象，用于初始化BookDAO
     * 功能：建立与数据管理层的连接，为图书管理业务提供数据访问能力
     */
    public BookService(Context context) {
        this.bookDAO = new BookDAO(context);
    }
    public BookService() {
        this.bookDAO = null;
    }
    public class LocalBinder extends Binder {
        public BookService getService() {
            BookService.this.bookDAO = new BookDAO(getApplicationContext());
            return BookService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    // 新增图书
    /**
     * 新增图书（完整流程：信息校验→调用DAO插入）
     * @param bookName 书名
     * @param author 作者
     * @param category 分类（如"计算机"、"文学"）
     * @param totalCount 总数量（≥1）
     * @param currentStock 当前在库数量（≤总数量，默认等于总数量）
     * @return ServiceResult 操作结果
     * 业务规则：
     * 1. 信息校验：书名/作者/分类不能为空，总数量≥1，在库数量≤总数量；
     * 2. 封装BookEntity调用BookDAO.insertBook()。
     * 适配报告：贴合《安卓设计报告.docx》"管理员·图书管理-书籍添加→输入信息→提交"流程
     */
    public ServiceResult addBook(String bookName, String author, String category, int totalCount, int currentStock) {
        // 1. 信息校验
        if (TextUtils.isEmpty(bookName) || TextUtils.isEmpty(author) || TextUtils.isEmpty(category)) {
            return new ServiceResult(false, "书名、作者或分类不能为空");
        }
        if (totalCount < 1) {
            return new ServiceResult(false, "总数量不能小于1");
        }
        if (currentStock < 0 || currentStock > totalCount) {
            return new ServiceResult(false, "在库数量必须≥0且≤总数量");
        }

        // 2. 封装实体并调用DAO插入
        BookEntity newBook = new BookEntity(bookName, author, category, totalCount, currentStock, 0);
        boolean insertSuccess = bookDAO.insertBook(newBook);
        if (insertSuccess) {
            return new ServiceResult(true, "新增图书成功");
        } else {
            return new ServiceResult(false, "新增图书失败，请重试");
        }
    }

    // 修改图书信息
    /**
     * 修改图书信息（支持修改书名、作者、分类、总数量）
     * @param bookId 图书ID（必须）
     * @param newBookName 新书名（可为null）
     * @param newAuthor 新作者（可为null）
     * @param newCategory 新分类（可为null）
     * @param newTotalCount 新总数量（可为null，需≥当前在库数量）
     * @return ServiceResult 操作结果
     * 业务规则：
     * 1. 必须指定bookId；
     * 2. 总数量修改时，需≥当前在库数量（避免总数量小于已借出数量）；
     * 3. 调用DAO更新前，验证图书是否存在（未被删除）。
     * 适配报告：贴合《安卓设计报告.docx》"管理员·图书管理-书籍修改→修改信息→提交"流程
     */
    public ServiceResult updateBook(Integer bookId, String newBookName, String newAuthor, String newCategory, Integer newTotalCount) {
        // 1. 校验参数
        if (bookId == null) {
            return new ServiceResult(false, "图书ID不能为空");
        }
        if (newBookName == null && newAuthor == null && newCategory == null && newTotalCount == null) {
            return new ServiceResult(false, "至少需修改一项信息");
        }

        // 2. 验证图书是否存在
        BookEntity targetBook = bookDAO.queryBookById(bookId);
        if (targetBook == null) {
            return new ServiceResult(false, "图书不存在或已被删除");
        }

        // 3. 校验总数量（若修改）
        if (newTotalCount != null && newTotalCount < targetBook.getCurrentStock()) {
            return new ServiceResult(false, "总数量不能小于当前在库数量（请先处理借出书籍）");
        }

        // 4. 封装修改信息
        BookEntity updateEntity = new BookEntity();
        updateEntity.setBookId(bookId);
        if (newBookName != null) updateEntity.setBookName(newBookName);
        if (newAuthor != null) updateEntity.setAuthor(newAuthor);
        if (newCategory != null) updateEntity.setCategory(newCategory);
        if (newTotalCount != null) updateEntity.setTotalCount(newTotalCount);

        // 5. 调用DAO更新
        boolean updateSuccess = bookDAO.updateBook(updateEntity);
        if (updateSuccess) {
            return new ServiceResult(true, "修改图书信息成功");
        } else {
            return new ServiceResult(false, "修改图书信息失败，请重试");
        }
    }

    // 删除图书（逻辑删除）
    /**
     * 逻辑删除图书（需先检查是否有未还记录）
     * @param bookId 图书ID
     * @param borrowRecordDAO 借阅记录DAO（用于检查未还记录）
     * @return ServiceResult 操作结果
     * 业务规则：
     * 1. 验证图书是否存在；
     * 2. 调用BorrowRecordDAO检查该图书是否有未还记录（有则禁止删除）；
     * 3. 调用BookDAO执行逻辑删除。
     * 适配报告：贴合《安卓设计报告.docx》"管理员·图书管理-书籍删除→确认→删除"流程
     */
    public ServiceResult deleteBook(Integer bookId, BorrowRecordDAO borrowRecordDAO) {
        // 1. 校验参数
        if (bookId == null) {
            return new ServiceResult(false, "图书ID不能为空");
        }

        // 2. 验证图书是否存在
        BookEntity targetBook = bookDAO.queryBookById(bookId);
        if (targetBook == null) {
            return new ServiceResult(false, "图书不存在或已被删除");
        }

        // 3. 调用DAO删除（BookDAO内部已检查未还记录）
        boolean deleteSuccess = bookDAO.deleteBook(bookId);
        if (deleteSuccess) {
            return new ServiceResult(true, "删除图书成功");
        } else {
            return new ServiceResult(false, "该图书存在未还记录，无法删除");
        }
    }

    // 多条件查询图书（区分管理员/读者权限）
    /**
     * 多条件查询图书（管理员查全量，读者仅查在库）
     * @param bookName 书名关键字（可为null）
     * @param author 作者关键字（可为null）
     * @param category 分类（可为null）
     * @param isAdmin 是否管理员（true=管理员，查所有未删除图书；false=读者，仅查在库图书）
     * @return BookQueryResult 查询结果（含图书列表）
     * 业务逻辑：
     * 1. 管理员：调用BookDAO.queryBookByCondition()查询所有未删除图书；
     * 2. 读者：调用BookDAO.queryInStockBooks()仅查询在库图书（current_stock > 0）。
     * 适配报告：贴合《安卓设计报告.docx》"管理员·图书管理-书籍查询"与"读者·图书检索-仅显示在库"流程
     */
    public BookQueryResult queryBooks(String bookName, String author, String category, boolean isAdmin) {
        List<BookEntity> bookList;
        if (isAdmin) {
            // 管理员：全量查询（未删除）
            bookList = bookDAO.queryBookByCondition(bookName, author, category);
        } else {
            // 读者：仅查询在库图书（简化条件：按书名模糊匹配，实际可扩展多条件）
            bookList = bookDAO.queryInStockBooks(bookName);
        }
        return new BookQueryResult(true, "查询成功", bookList);
    }

    // 通用服务结果封装类
    public static class ServiceResult {
        private boolean success;
        private String message;

        public ServiceResult(boolean success, String message) {
            this.success = success;
            this.message = message;
        }

        public boolean isSuccess() { return success; }
        public String getMessage() { return message; }
    }

    // 图书查询结果封装类（含列表数据）
    public static class BookQueryResult extends ServiceResult {
        private List<BookEntity> bookList;

        public BookQueryResult(boolean success, String message, List<BookEntity> bookList) {
            super(success, message);
            this.bookList = bookList;
        }

        public List<BookEntity> getBookList() { return bookList; }
    }


}
